package com.bzkj.basicinfo.service.warehouse;



import com.bzkj.basicinfo.domain.warehouse.PdaBillsList;
import com.bzkj.basicinfo.domain.warehouse.PdaMsfxBardata;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 单据主表Service接口
 * 
 * @author lixinyu
 * @date 2025-06-13
 */
public interface IPdaBillsListService 
{
    /**
     * 查询单据主表
     * 
     * @param BillsID 单据主表主键
     * @return 单据主表
     */
    public PdaBillsList selectPdaBillsListByBillsID(String BillsID);


    /**
     * 查询单据明细列表（以批次号和药品名称为主）
     *
     * @param pdaBillsList 单据主表
     * @return 单据明细集合
     */
    public List<PdaBillsList> selectPdaBillsDetailList(PdaBillsList pdaBillsList);

    /**
     * 新增单据主表
     * 
     * @param pdaBillsList 单据主表
     * @return 结果
     */
    public int insertPdaBillsList(PdaBillsList pdaBillsList);

    /**
     * 修改单据主表
     * 
     * @param pdaBillsList 单据主表
     * @return 结果
     */
    public int updatePdaBillsList(PdaBillsList pdaBillsList);

    /**
     * 批量删除单据主表
     * 
     * @param BillsIDs 需要删除的单据主表主键集合
     * @return 结果
     */
    public int deletePdaBillsListByBillsIDs(String[] BillsIDs);


    /**
     * 更新单据上传状态
     *
     * @param billsID 单据号
     * @param uploadState 上传状态
     * @return 结果
     */
    public int updateUploadState(String billsID, String uploadState);

    /**
     * 软删除单据主表（将状态改为3）
     *
     * @param billsIDs 需要删除的单据主表主键集合
     * @return 结果
     */
    public int softDeletePdaBillsList(String[] billsIDs);

    /**
     * 上传单据到易联云码平台
     *
     * @param billsID 单据号
     * @param institutionData 医疗机构信息
     * @return 结果
     */
    public boolean uploadBillsToYiLianYunMa(String billsID, Map<String, String> institutionData);

    /**
     * 获取首页统计数据
     *
     * @return 统计数据
     */
    public Map<String, Object> getDashboardStatistics();

    /**
     * 获取单据二维码信息
     *
     * @param billsID 单据号
     * @return 二维码信息列表
     */
    public List<PdaMsfxBardata> getQrCodeInfoByBillsID(String billsID);


    /**
     * 根据单据ID和药品ID获取层级结构的二维码信息
     *
     * @param billsID 单据ID
     * @param drugID 药品ID
     * @return 层级结构的二维码信息
     */
    public Map<String, Object> getQrCodeHierarchyByBillsIDAndDrugID(String billsID, String drugBatchNo,String drugID);

    /**
     * 根据父级码获取子码
     *
     * @param parentCode 父级码
     * @return 子码列表
     */
    public List<PdaMsfxBardata> getChildCodesByParentCode(String parentCode);


    /**
     * 批量导出选中的单据数据（包含明细和追溯码信息）
     *
     * @param response HTTP响应
     * @param billsIDs 单据ID数组
     */
    public void exportSelectedBillsWithDetails(HttpServletResponse response, String[] billsIDs);

    /**
     * 获取单据明细列表（用于批次号维护）
     *
     * @param billsID 单据号
     * @return 明细列表
     */
    public List<Map<String, Object>> selectBillsDetailList(String billsID);

    /**
     * 更新明细批次号
     *
     * @param billsID 单据号
     * @param details 明细数据列表
     * @return 更新结果
     */
    public int updateDetailBatchNumber(String billsID, List<Map<String, Object>> details);

    /**
     * 通过单据号导入数据
     *
     * @param billsID 单据号
     * @return 导入结果
     */
    public Map<String, Object> importBillsByBillsID(String billsID);

    /**
     * 通过时间段导入数据
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param institutionName 往来单位名称（可选）
     * @param billsType 单据类型（A-全部，AI-入库，AO-出库）
     * @return 导入结果
     */
    public Map<String, Object> importBillsByDateRange(String startDate, String endDate, String institutionName, String billsType);

    /**
     * 获取所有往来单位列表（前端过滤）
     *
     * @return 往来单位列表
     */
    public List<Map<String, Object>> getAllInstitutionsList();

    /**
     * 更新往来单位信息
     *
     * @return 更新结果
     */
    public Map<String, Object> updateCustomerInfo();

    /**
     * 定时查询当天出库单据
     *
     * @return 查询结果
     */
    public Map<String, Object> queryTodayOutboundBills(String billsType);

    /**
     * 批量导入选中的单据
     *
     * @param billsData 选中的单据数据列表（包含单据号和单据时间）
     * @return 导入结果
     */
    public Map<String, Object> importSelectedBills(List<Map<String, String>> billsData);
}
